INVADER GAME ――――――――――――――――――――――――――――――――――――――― Oh!mz 1987年 4月号掲載 S−OS SWORD マシン語 INVADER GAME.SOS       03000H−0430BH S:03000H ソース  INVADER1.ASC      INVADER2.ASC 起動方法 INVADER GAME.SOSをロード J3000 ――――――――――――――――――――――――――――――――――――――― その昔、パソコンやゲームセンターを賑わした インベーダーゲームがS−OS用として復活しました。 ゲームはもちろん、デモ画面の楽しさもまた格別。 まさにS−OS用アクションゲームの第1弾に ふさわしいプログラムといえるでしょう。 ・――――――― |■                | |   懐かしのインベーダー    | |                ■|           ――――――――・ 1月号のSENTINELで予告した インベーダーゲームが完成しましたので、発表します。 1月号で書いたように、これはBEMS用のゲームではありません。 S−OSのサブルーチンだけでもこれだけのことができるんだ、 というところをじっくり味わってください。 S−OS用なので各機種に依存するグラフィックキャラクタは 使用していません、 というか、使用できませんでした。 しかし、ゲームの雰囲気は十二分にお伝えすることができると思います。 また、デモにも凝ってみましたので、 錯綜するドットにあふれた最近のゲームのデモに食傷気味の皆さん、 シンプルなキャラクタが必死に演じるこのデモをお楽しみください。 ・――――――― |■                | |       遊び方       | |                ■|           ――――――――・ プログラムをロードしたら、 S−OSのモニタから#J3000とすると、 デモが始まります。 得点や操作についての説明も出ますのでよく見ておいてください。 特に左右移動はK、Lキーですのでおまちがえなく。 デモにも見飽きたらスペースキーを少し長めに押してください。 お馴染みのゲームがスタートします。 左右に動きながらだんだん下に迫ってくる敵を、 ひたすら撃ち落としてください。 ときどきUFO(敵の母艦?)が画面上部を横切るので、 そいつも狙ってください。 自機は最初3機あり、1500点で1upします。 ずいぶん低いなと思われる方がいらっしやるかもしれませんが、 まあプレイしてみてください。 1500点取るのもかなりたいへんなのがわかると思います。 最近のゲームはとかく点数がインフレ気味で 100万点 ボーナスなんてのもありますが、 コツコツ地味にポイントを稼ぐのも たまにはいいのではないでしょうか (陰の声:昔のゲームはみんなそうだった……)。 さて、話が横にそれかけましたが自機の操作は、 Kキーで左、Lキーで右、 スペースキーでビーム発射となっています。 このビームは1発ずっしか撃てません。 その代わり、スペースキーをずっと押していれば 前のビームが消えるとすぐに次のビームが発射されます。 敵のビームはこちらのビームが当たっても、 互いにすり抜けてしまいます。 逃げるしかありません。 また、障害物は自機あるいは敵のビームが 8発当たると少しずつ消えていきます。 動いている敵を全部倒すと1面クリアです。 自機が全部やられるか、 敵が自機と同じところまで降りてきてしまうと ゲームオーバーです。 なお、ゲーム中にシフト+ブレイクキーを押すと S−OSのモニタに戻ります。 このプログラムは全機種共通で走りますが、 MZ−2500を使用している方は以下の点に注意してください。 1)スクロールモードを25行に変更 2)文字のフォントは8×8のものを使用すること 具体的な方法は1986年8月号を参照してください。 ・――――――― |■                | |      入力方法       | |                ■|           ――――――――・ ダンプリスト(3000H〜430BH)を MACINTO−C(B000Hからのもの)などで打ち込んでいきます。 入カミスがないかどうかチェックサムなどでよく確認してから、 スタートアドレス3000Hでセーブしてください。 各機種のモニタを使用する場合は、マニュアルをよく読んで、 操作ミスのないようにしましょう。 いずれの場合でもこのプログラムを実行する際には、 S−OS“SWORD”が必要です。 ソースリストはメインとデモの部分が別別になっています。 しかし、注意していただきたいのは これは分割アセンブルするのではない、 ということです。 したがって、改造前のZEDAでもアセンブル可能です。 具体的には、まず、メインのソースを読み込んでアセンブルし、 次に、テキストをクリアして (改造版ZEDAではさらにA0を実行して)、 デモのソースを読み込んでアセンブルします。 そして、オブジェクトをオフセット付きでセーブします。 詳しくは、ZEDAの各掲載記事を参照してください。 なお、MZ−80K/C/1200/ 700/1500をお使いの方は、 このままではメモリ不足のためにアセンブルできません。 そこでソースリストの不要なスペースやコメントを削除して、 オブジェクトの格納アドレスを変更するなどの処置が必要です。 ソースリストを見るとわかるように、 本プログラムではデモの部分がかなり大きくなっています。 入力するのが面倒だという方は、 3000H〜38FFHを打ち込んだあと、 3003Hからの3バイトを00Hに変更してください、 そして上記の範囲をセーブすればOKです。 実行させると、すぐにゲームが始まる点を除けば、 変更前と変わりはありません。 ・―――――――――――――――――――――――――――・ |ここでMZ−80B/2000/2200用“SWORD”の    | |デバッグ情報です。                  | |これらの機種ではキー入力時に             | |カーソルキャラクタが正常に取り込めませんでした。   | |3月号で発表したダンプリストに            | |以下のような修正を加えてください。          | |  1B61H  20H → 1EH             | |この修正を行わないと                 | |今回のINVADER GAMEは           | |正常に動作しないので注意してください。        | ・―――――――――――――――――――――――――――・ ・――――――― |■                | |     プログラム解説     | |                ■|           ――――――――・ それではデモ画面のハイライトシーンを中心に見ていきましょう。 まずは、ゲーム開始直後のタイトル文字が どわーっと集まってくる場面から。 一見、ものすごく複雑なことをやっているようにも見えますが、 アルゴリズムは簡単です。 まずタイトル文字のそれぞれを縦横の線で4分割します。 そして、たとえば右上部分だけの画面、左下だけの部分というように 画面を4つのブロックに分解し、 それぞれのブロックを画面の外側から所定の位置まで 斜めにズリズリ引きずっているだけなのです。 次に「S−OS」の文字が 画面にポツポツと浮かび上がってくるシーンですが、 まず画面を構成するデータを1キャラクタごとに分解し、 それぞれX、Y座標とキャラクタコードの3バイトのデータに展開して TTLSOSのワークェリアに格納します。 それを乱数を使ってシャッフルし、 あとはそのワークエリアのデータを順番に表示すればよいのです。 どちらもタネをあかせば単純なルーチンですが、 なかなか劇的な効果があると思いませんか? ワークエリアの一覧表を表1に示しておきます。 ソースリストは楽しく読めるように配慮していますので、 そのほかのルーチンについては皆さんで解析してみてください。 表1 ワークエリアの使用状況 ・―――――――――――――――――――――――――――――――――――――・ |■■■■■■■■■■■■■1面ごとに設定するもの■■■■■■■■■■■■■| | | | +0+1+2+3+4+5+6+7+8+9+A 初期値 | |INVTBL:5000H □□□□□□□□□□□ 〔1〕 | | 5010H □□□□□□□□□□□ | | 5020H □□□□□□□□□□□ | | 5030H □□□□□□□□□□□ | | 5040H □□□□□□□□□□□ | | | | +0+1+2+3+4+5+6+7+8+9+A+B | |SHLTBL:5050H □□□□□□□□□□□□ 〔8〕 | | 5060H □□□□□□□□□□□□ | | | |LEDGE: 5070H 最左端に存在するインベーダーの列 〔0〕 | |REDGE: 5071H 最右端に存在するインベーダーの列 〔10〕 | |DEDGE: 5072H 最下端に存在するインベーダーの段 〔4〕 | | | |MOVDRC:5073H インベーダーの動く方向 〔1〕 | | 0……左 1……右 2,3……下 | | | |LIVINV:5074H 生き残っているインベーダーの数 〔55〕 | |WAITCH:5075H ウェイトカウンタの値 〔20H 〕 | |NOWCNT:5076H 今のカウンタの値 〔20H 〕 | | | |MSHIPX:5077H 自機のX座標 〔1〕 | |MSHIPY:5078H 自機のY座標 〔24〕 | | | |MBEAMX:5079H 自分のビームのX座標 〔0〕 | |MBEAMY:507AH 自分のビームのY座標 〔0FFH〕 | | | |BEAMWK:507BH(6) インベーダーの落とすビームのワーク 〔0,0FFH〕*3 | | | |UFOX :5071H UFOのX座標 〔0〕 | |UFOY :5072H UFOのY座標 〔0〕 | | | |UFODRC:5083H UFOの進む方向 〔0〕 | | 0………左 1………右 | | | |UFDICT:5084H UFOが撃墜されてからのカウント 〔0〕 | |UFOCNT:5085H(2) 前のUFOが飛んでからのカウント 〔FFFFH 〕 | | | |CNT01 :5087H 0と1の値を刻む 〔0〕 | | | |TPINVX:5088H 左上端のインベーダーのX座標 〔1〕 | |TPINVY:5089H 左上端のインベーダーのY座標 〔(面数mod10)+1〕 | |SCINEN:508AH 現在の面数 〔(+1)〕 | | | |■■■■■■■■■■■■ゲームごとに設定するもの■■■■■■■■■■■■■| |SCINEN:508AH 現在の面数 〔0〕 | |LFTHOU:508BH 残りの砲台の数 〔2〕 | | | |SCDTFU:508CH スコアの状態を表す 〔2〕 | | | | 2……1500点以下 1……2000点以下 0……それ以上 | | | |SCRFIG:5090H 表示するスコアの桁数 〔1〕 | |SCREWK:5091H(7) 得点のワーク(十の位〜千万の位)〔0000000〕 | | | |HSCFIG:5098H 表示するハイスコアの桁数 〔4〕 | |SCREWK:5091H(7) ハイスコアのワーク(十の位〜千万の位) 〔0000000〕 | | | | | |■■■■■■■■■■■■■■デモ用ワークエリア■■■■■■■■■■■■■■| |RDBLKX:50A0H 右下ブロックのx座標 〔−29〕 | |RDBLKY:50A1H 右下ブロックのY座標 〔−14〕 | | | |LDBLKX:50A2H 左下ブロックのX座標 〔8〕 | |LDBLKY:50A3H 左下ブロックのY座標 〔−2〕 | | | |LUBLKX:50A4H 左上ブロックのX座標 〔8〕 | |LUBLKY:50A5H 左上ブロックのY座標 〔25〕 | | | |RUBLKX:50A6H 右上ブロックのX座標 〔−29〕 | |RUBLKY:50A7H 右上ブロックのY座標 〔37〕 | | | |MTSTEP:50A8H タイトルの表示ステップ 〔19〕 | | | |OFSETX:50A9H(2) 仮想画面のオフセット値 〔0〕 | | | |TTLSOS:5100H(1800) タイトル(S−OS)のワーク | |VIRSCN:5900H(1800) 仮想画面ワーク | | | ・―――――――――――――――――――――――――――――――――――――・